package xyc.sjxy.utils;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedReader;
import java.io.IOException;
import java.text.SimpleDateFormat;

public class JsonUtils {
    /**
     * ObjectMapper实例，用于JSON的序列化和反序列化。
     */
    private static ObjectMapper objectMapper;  //

    /**
     * 静态初始化块，配置ObjectMapper实例。
     * 设置日期格式为"yyyy-MM-dd HH:mm:ss"。
     */
    static {
        objectMapper = new ObjectMapper();
        // 启用忽略未知属性的功能 反序列化：json---》java对象
        objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
    }

    /**
     * 将对象序列化为JSON字符串。
     *
     * @param obj 待序列化的对象
     * @return 序列化后的JSON字符串
     * @throws JsonProcessingException 如果序列化过程中发生错误
     */
    public static String toJson(Object obj) throws JsonProcessingException {
        return objectMapper.writeValueAsString(obj); // {id：1，name：tom} =》 {"id":1,"name":"tom"}
    }

    /**
     * 将对象序列化为JSON，并写入HTTP响应中。
     *
     * @param obj      待序列化的对象
     * @param response HTTP响应，用于写入JSON字符串
     * @throws JsonProcessingException 如果序列化过程中发生错误
     */
    public static void WriteJson(Object obj, HttpServletResponse response) throws JsonProcessingException {
        response.setContentType("application/json;charset=UTF-8");
        try {
            String json = toJson(obj);
            response.getWriter().write(json);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 将JSON字符串反序列化为指定类型的对象。
     *
     * @param json  JSON字符串
     * @param clazz 目标对象的类
     * @return 反序列化后的对象
     * @throws JsonProcessingException 如果反序列化过程中发生错误
     */
    public static <T> T toObject(String json, Class<T> clazz) throws JsonProcessingException {
        return objectMapper.readValue(json, clazz);
    }

    /**
     * 从HTTP请求中读取JSON字符串，并反序列化为指定类型的对象。
     *
     * @param request HTTP请求，从中读取JSON字符串
     * @param clazz   目标对象的类
     * @return 反序列化后的对象
     * @throws IOException 如果读取过程中发生错误
     */
    public static <T> T readJson(HttpServletRequest request, Class<T> clazz) throws IOException {
        StringBuilder stringBuffer = new StringBuilder();
        String line = null;
        try {
            BufferedReader reader = request.getReader();
            while ((line = reader.readLine()) != null) {
                stringBuffer.append(line);
            }
            return objectMapper.readValue(stringBuffer.toString(), clazz);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }


}